Contents
Neural Network (Basic Ideas)
How to pick the “Best” function
現在的問題點是要如何找到一組 parameter 來讓 $C(\theta)$ 最小。這邊採用的方法是 Gradient Descent 。
Gradient Descent
先簡化一下 parameter ,變成只有一個變數。其想法就是,對某點作 微分 後得到其斜率,再依據斜率決定要如何 移動 點。
如果斜率為負: 將點往右移
如果斜率為正: 將點往左移
$\theta^0$ 要加上 斜率乘 $- \eta$ 。如果斜率為負,要往右移,所以要加負號。反之則是往左。(斜率取絕對值後,值越大代表直線越陡峭)
至於 $\eta$ 則是指 learning rate。(移動的距離有多寬)
目的是要找一個點使的 $C(\theta)$ 為 local minimum。
接著來看如果一組 parameter 內有 兩個變數 的話:
$\theta$ 的 上標 代表第幾組 parameter,下標(1,2) 則是變數(兩個)。
其 梯度($\nabla$) 對兩個變數去做 偏微分,算出來的結果一樣是 2 維的 vector。
接著就是去找下一個點 => Update Parameter ,寫成式子如下圖:
用圖來表示這一連串的操作就會是這樣:
loop: 計算 Gradient $\nabla$ -> 移動點
直到 Gradient 的 norm($\nabla C(\theta)$) 算出來接近零才停。
關於倒三角這個符號,向量微分算子。
Gradient Descent 的原理
同樣是以兩個變數為例,在下圖中線上的數字代表著 $C(\theta)$ 的值,而圖中的點就是每次 update 的 parameter。
而我們可以做到的事是: 給我一個點,可以知道這個點 附近 的 $C(\theta)$ 最小值 是在哪一點。
所以我們就一直往這個會使 $C(\theta)$ 變小的地方邁進,最後就會走到 local minimum。
這邊所謂的 附近 ,就如同圖中的紅圈一樣。有個有趣的比喻: 就像是 戰爭迷霧,我們只能看到自己視野內的東西。
至於怎麼看視野內的東西呢?這邊提到了 Taylor Series ,大致上就是當 $x = x_0$ ,且可微無限多次時,這個函數可以寫成圖中的 $h(x)$ 。(Taylor Series)
然後當 $x_0$ 和 $x$ 很接近時, $(x-x_0)^k$ 的項後面會越來越小,所以我們可以只看它的前兩項。
拓展到兩個變數:
而根據 Taylor Series ,當我們有一點 $(a,b)$ 時,如果 紅色圈圈 的範圍很小(也就是跟 $(a,b)$ 很接近),那在這範圍內的 $\theta = \{ \theta_1,\theta_2 \}$ ,其 $C(\theta)$ 可以寫成圖中那樣:
更進一步來說,對於 偏微分 的那兩項,當 $C(\theta)$ 偏微分完後再帶入 $(a,b)$ ,它們也就只是個 常數( $u$ 和 $v$ ) 了,所以可以再進一步的簡化。
($s$ 裡漏打 $a$)
有了這個式子後,我們可以輕易地找到,使這個紅圈範圍內 $C(\theta)$ 值最小的 $(\theta_1,\theta_2)$ 。
(至於如何求出 $\theta_1,\theta_2$ ,影片中是說自己設個範圍,然後找)
而最後解出來的式子如下圖:
可以看到圖中 $(u,v)$ 向量其實就是前面所講的 $\nabla C(a,b)$。
而 learning rate 就是這個 紅色圈圈 的半徑,也就是為甚麼會有前面所說 戰爭迷霧 的問題了,因為如果 $\eta$ 設 太大,這個式子就不成立了。(在 Taylor Series 中二次項的部分也不能被刪除)
反過來說,如果 $\eta$ 無窮小,順著 gradient 的方向,我們就一定能讓 Cost 變小。
而這也帶出一件事,如果我們把 Taylor Series 中的二次項加進訓練的過程,通常可以提升訓練的效果,但也會增加額外的運算量。
Practical Issues
Learning Rate
對於如何設定 learning rate ,以後會在深談。這邊只先講講它的影響:
當太大時,有可能找不到我們要的,會發生來回震盪或直接飛出去的狀況。
當很小時,只要花的時間夠久都可以找到。(非常久~~)
Stochastic Gradient Descent
先來簡化一下,原先在 cost function 內,需要用每一筆資料和 $\hat{y}^r$ 做計算,這邊把每一筆簡化成 $C^r(\theta)$
對於前面所提的 gradient descent ,在每次 update 時需要對全部的資料都算一次,再做 sum。(實際上這樣不太行)
這邊要提的叫做 Stochastic Gradient Descent :
每次 update 時 ,我們只 挑一筆 資料來看 $x^r$。
只要 update 得夠多次,期望值算出來其實是一樣的,那這樣的好處是什麼?
要先解釋一個名詞 epoch : 把所有的 examples 都看過一次後叫 epoch。
接著來看看好處。
從下方這張圖可以看出,如果有 20 個 example ,原先的 Gradient Descent 要看完全部才會更新,此時 Stochastic Gradient Descent 就已經更新 20 次了。
Mini-batch Gradient Descent
實作上還有另一個方法,介於 Stochastic Gradient Descent 和 Gradient Descent 之間的就叫 Mini-batch Gradient Descent 。
做法是,每次挑選 B 個 example 來計算,B 就是 batch 的大小。 (Stochastic Gradient Descent 其實也就是 $B = 1$ 的情況)
要注意的地方是要 shuffle data ,因為我們希望所選出來的資料是有各式各樣類型的。
這邊有個比較,紅線是訓練時間(看右邊的軸),藍線是精準度(看左邊的軸)。
(全部的 example 都看就是正常 Gradient Descent)
Recipe for Learning
這邊主要講解一下在實際練習時會遇到的問題。
如果在 training data 的部分時就沒有好的結果:
關於 Overfitting 的小解釋 維基百科:
我們從 training data 中得出的 best parameter ,並不代表我們在 test data 上也是如此適用。有可能因為過度符合 training data 導致在 test data 中有不好的結果。(可增加 training data 來解決)